package bszt.jd;

import java.util.*;

public class Code05 {

    /**
     * 问题描述
     * LYA是一位图书馆管理员，她负责整理一排书架上的图书。书架上有n本互不相同的书，每本书都有一个唯一的编号。LYA希望将这些书按照编号从小到大排列，但她只能使用两种整理方法
     * 选择相邻的两本书，交换它们的位置
     * 选择相邻的三本书，将它们的顺序完全颠倒
     * LYA发现，无论书架上的书如何排列，总是可以通过有限次上述操作将所有书排列成升序。然而，她注意到如果只使用第一种方法，整理过程会变得非常繁琐，就像冒泡排序一样低效
     * 为了提高效率，LYA决定尽可能多地使用第二种方法，只在必要时才使用第一种方法。现在，她想知道在将所有书排列成升序的前提下，最少需要使用多少次第一种方法
     * <p></p>
     * 输入格式
     * 第一行输入一个正整数n，表示书架上书的数量
     * 接下来n行，每行一个整数a_i，表示每本书的编号。保证这些编号互不相同
     * <p></p>
     * 输出格式
     * 输出一个整数，表示LYA最少需要使用的第一种方法的次数
     */

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] books = new int[n];

        // 读取书籍编号
        for (int i = 0; i < n; i++) {
            books[i] = sc.nextInt();
        }

        System.out.println(minSwapOperations(n, books));
    }

    public static int minSwapOperations(int n, int[] books) {
        int[] sortedBooks = books.clone();
        Arrays.sort(sortedBooks);
        Map<Integer, Integer> positionMap = new HashMap<>();

        // 创建书籍编号到最终位置的映射
        for (int i = 0; i < n; i++) {
            positionMap.put(sortedBooks[i], i);
        }

        int oddMoves = 0;
        // 统计需要奇数次移动的书的数量
        for (int i = 0; i < n; i++) {
            if (Math.abs(i - positionMap.get(books[i])) % 2 == 1) {
                oddMoves++;
            }
        }

        // 返回最少需要的第一种操作次数
        return oddMoves / 2;
    }
}
